home *** CD-ROM | disk | FTP | other *** search
Text File | 1989-12-31 | 44.6 KB | 1,791 lines |
- This is patch 10 for nn release 6.3
-
- This is primarily a "new features" release, but it also fixes some
- bugs (low priority ones).
-
-
- BUGS FIXED
- ----------
-
- The tables in the online manual are now properly aligned.
-
- A core dump when viewing empty articles have been fixed (thanks to
- Sjoerd Mullender).
-
- Type-ahead will now be flushed when entering a new group (since you
- don't know which group it is, nor which articles are in it, what would
- you type-ahead anyway?)
-
- Number of killed articles on the menu is now updated when you kill
- articles with the K command.
-
- The `Y' {overview} command now marks groups with an entry macro with a
- % after the name.
-
- The entry macro is no longer executed again after a goto-group command
- completes. You can now use local variables described below instead.
-
- The nncheck -t output format is now similar to the output from the `Y'
- command (but only one column).
-
- Specifying `comp.' in the presentation sequence no longer (falsely)
- includes `comp' (bad example, since there is no comp group, but I hope
- you get the idea).
-
- Variable name completion now works for no"name.." also.
-
-
- NEW FEATURES
- ------------
-
- The variables can now be assigned local values which are only
- effective until the current group is left. A variable is made local
- using the :local command, e.g.
-
- :local cross-post
-
- A new value can be assigned to the local variable in the same command:
-
- :local cross-post on
- :local auto-preview-mode off
- :local default-save-file +src/$L/misc
-
- Local variables are marked with a '>' in front of the name when
- displayed with the :set command.
-
- This can be combined with a new "on group groups..." construction:
-
- on group comp.sources* alt.sources
- :local kill off
- end
-
- This allows you to specify entry macros for several groups without
- disrupting the presentation sequence.
-
-
- $(VAR) can now be specified in file names - it is expanded into the
- value of the environment variable VAR. For example, you can specify
- this in the global init file (provided every user has a MAIL variable
- set):
- set mail $(MAIL)
-
-
- There is a new "Auto Preview Mode" where hitting the article id letter
- immediately enters preview mode rather than selecting the article. It
- is enabled by setting the auto-preview-mode variable.
-
-
- There are new options to nnmaster:
- -B Remove bad articles from the spool directory
- -b Do not ignore bad articles.
- -Ltypes Do not write entries of the specified types in the log file.
-
- There is a new confirm-create variable that will cause nn to wait for
- confirmation before creating new files.
-
- TO APPLY:
-
- Feed this patch through the "patch" program.
-
-
- *** /usr/storm/nn6.3.9/patchlevel.h Fri Oct 20 23:24:42 1989
- --- patchlevel.h Thu Oct 26 12:46:09 1989
- ***************
- *** 29,35 ****
- *
- * 1989-09-15: Patch 8: pack_name.c nntp.c
- * 1989-10-20: Patch 9: several files
- */
-
- ! #define PATCHLEVEL 9
-
- --- 29,36 ----
- *
- * 1989-09-15: Patch 8: pack_name.c nntp.c
- * 1989-10-20: Patch 9: several files
- + * 1989-11-17: Patch 10: several files
- */
-
- ! #define PATCHLEVEL 10
-
-
- *** /usr/storm/nn6.3.9/answer.c Fri Oct 20 23:24:44 1989
- --- answer.c Thu Nov 16 15:39:21 1989
- ***************
- *** 281,287 ****
- return 2;
- }
- } else {
- ! prompt("Confirm cancel: '%.50s'", ah->subject ? ah->subject : "");
- if (yes(1) <= 0) return 1;
- }
-
- --- 281,289 ----
- return 2;
- }
- } else {
- ! prompt("Confirm cancel: '%s: %.30s'",
- ! ah->sender ? ah->sender : "",
- ! ah->subject ? ah->subject : "");
- if (yes(1) <= 0) return 1;
- }
-
-
- *** /usr/storm/nn6.3.7/articles.h Fri Sep 8 12:46:41 1989
- --- articles.h Tue Oct 24 10:11:54 1989
- ***************
- *** 7,15 ****
- article_number n_articles;
- article_header **articles;
-
- - /* number of articles killed by last access_group call */
- -
- - int killed_articles;
-
- typedef struct thunk {
- char *this_thunk;
- --- 7,12 ----
-
- *** /usr/storm/nn6.3.7/collect.c Fri Sep 8 12:46:41 1989
- --- collect.c Tue Oct 31 18:27:59 1989
- ***************
- *** 4,9 ****
- --- 4,12 ----
-
- #define COUNT_RE_REFERENCES /* no of >>> depends on Reference: line */
-
- + export int ignore_bad_articles = 1; /* no Newsgroups: line */
- + export int remove_bad_articles = 0;
- +
- import int trace;
-
-
- ***************
- *** 128,134 ****
- * it is not really necessary to save anything in the data file
- * we simply use the index file to get the *first* available article
- */
- ! return 1; /* but we have still collected one article */
- }
-
- /* map cross-postings into a list of group numbers */
- --- 131,151 ----
- * it is not really necessary to save anything in the data file
- * we simply use the index file to get the *first* available article
- */
- ! return 0;
- ! }
- !
- ! if (ignore_bad_articles && news.ng_groups == NULL) {
- ! char *rem = "";
- !
- ! #ifndef NNTP
- ! if (remove_bad_articles) {
- ! unlink(group_path_name);
- ! rem = "removed ";
- ! }
- ! #endif NNTP
- ! log_entry('B', "%sbad article: %s/%ld", rem,
- ! current_group->group_name, (long)art_num);
- ! return 0;
- }
-
- /* map cross-postings into a list of group numbers */
-
- *** /usr/storm/nn6.3.9/folder.c Fri Oct 20 23:24:47 1989
- --- folder.c Fri Nov 17 18:51:47 1989
- ***************
- *** 65,70 ****
- --- 65,86 ----
-
- }
-
- + if (c == '$' && src[1] == '(') {
- + char envar[64];
- + for (src += 2, cp = envar; (c = *src) != NUL && c != ')'; src++)
- + *cp++ = c;
- + *cp = NUL;
- + if (cp != envar) {
- + if ((cp = getenv(envar)) != NULL)
- + while (*cp) *dp++ = *cp++;
- + else {
- + msg("Environment variable $(%d) not set", envar);
- + return 0;
- + }
- + }
- + goto no_parse;
- + }
- +
- if (c == '$' && !isalnum(src[2])) {
- remap = 0;
- cp = NULL;
-
- *** /usr/storm/nn6.3.9/global.c Fri Oct 20 23:24:47 1989
- --- global.c Fri Nov 3 08:45:11 1989
- ***************
- *** 8,13 ****
- --- 8,14 ----
- export char news_directory[] = NEWS_DIRECTORY; /* /usr/spool/news */
- export char lib_directory[] = LIB_DIRECTORY; /* /usr/local/lib/nn */
- export char db_directory[] = DB_DIRECTORY; /* /usr/spool/nn */
- + export char *log_entry_filter = NULL;
-
- export char *temp_file;
-
- ***************
- *** 479,484 ****
- --- 480,489 ----
- {
- FILE *log;
- char *msg, buf[512], logname[512];
- +
- + if (log_entry_filter != NULL)
- + for (msg = log_entry_filter; *msg; msg++)
- + if (*msg == type) return 1;
-
- msg = va_arg1(char *);
- vsprintf(buf, msg, va_args2toN);
-
- *** /usr/storm/nn6.3.7/group.c Fri Sep 8 12:46:43 1989
- --- group.c Tue Oct 24 10:11:54 1989
- ***************
- *** 21,26 ****
- --- 21,27 ----
- import int article_limit, also_read_articles;
- import int no_update;
- import int merged_menu;
- + import int killed_articles;
-
- char *quick_match();
-
- ***************
- *** 277,283 ****
- if ((subpattern && !regexec(subpattern, ah->subject)) ||
- (submask && quick_match(ah->subject, submask) == NULL) ||
- (do_kill && kill_article(ah))) {
- - killed_articles++;
- release_str(&str_marker);
- goto read_next;
- }
- --- 278,283 ----
- ***************
- *** 371,377 ****
- o_first_article = current_first_article;
- o_killed = killed_articles;
- mark_memory(&sel_marker);
- !
- if (init_group(gh) <= 0) menu_return( ME_NEXT );
- m_invoke(-1);
-
- --- 371,378 ----
- o_first_article = current_first_article;
- o_killed = killed_articles;
- mark_memory(&sel_marker);
- ! mark_var_stack();
- !
- if (init_group(gh) <= 0) menu_return( ME_NEXT );
- m_invoke(-1);
-
- ***************
- *** 513,518 ****
- --- 514,520 ----
-
- current_first_article = o_first_article;
- killed_articles = o_killed;
- + restore_variables();
-
- return menu_cmd;
- }
- ***************
- *** 844,850 ****
-
- if (gh != orig_group) {
- current_first_article = o_current_first;
- ! if (orig_group) { init_group(orig_group); m_invoke(-1); }
- }
-
- goto_exit:
- --- 846,852 ----
-
- if (gh != orig_group) {
- current_first_article = o_current_first;
- ! if (orig_group) init_group(orig_group);
- }
-
- goto_exit:
- ***************
- *** 993,999 ****
- (long)(gh->last_l_article - gh->last_article),
- (gh == current_group) ? '*' : ' ',
- gh->group_name,
- ! gh->group_flag & G_SUBSCRIPTION ? "" : " (!)");
-
- return 0;
- }
- --- 995,1002 ----
- (long)(gh->last_l_article - gh->last_article),
- (gh == current_group) ? '*' : ' ',
- gh->group_name,
- ! (gh->group_flag & G_SUBSCRIPTION) == 0 ? " (!)" :
- ! gh->enter_macro ? " %" : "");
-
- return 0;
- }
-
- *** /usr/storm/nn6.3.9/init.c Fri Oct 20 23:24:49 1989
- --- init.c Fri Nov 3 16:01:39 1989
- ***************
- *** 212,217 ****
- --- 212,218 ----
- "decode", 6, 0,
- "define", 6, 0,
- "help", 4, 2,
- + "local", 5, 3,
- "man", 3, 0,
- "map", 3, -1,
- "map both", 8, 4,
- ***************
- *** 219,224 ****
- --- 220,226 ----
- "map menu", 8, 4,
- "map show", 8, 4,
- "mkdir", 5, 1,
- + "patch", 5, 0, /* QUICK HACK */
- "print", 5, 0, /* QUICK HACK */
- "pwd", 3, 0,
- "rmail", 5, 0,
- ***************
- *** 403,408 ****
- --- 405,411 ----
- FILE *initf;
- {
- extern char *m_define(), *parse_enter_macro();
- + int i;
-
- if (!split_command(cmd)) return ok_val;
-
- ***************
- *** 427,432 ****
- --- 430,447 ----
- return ok_val;
- }
-
- + CASE( "local" ) {
- + if (ARGTAIL == NULL) goto stx_err;
- +
- + cmd = argv(1);
- + if (!push_variable(cmd)) return ok_val;
- +
- + if (ARGTAIL && set_variable(cmd, 1, ARGTAIL))
- + return AC_REDRAW;
- + else
- + return ok_val;
- + }
- +
- CASE( "set" ) {
- if (ARGTAIL == NULL) {
- disp_variables();
- ***************
- *** 856,862 ****
-
- if (code != K_INVALID) {
- menu_key_map[parse_key(argv(2))] = code;
- ! return;
- }
- }
-
- --- 871,877 ----
-
- if (code != K_INVALID) {
- menu_key_map[parse_key(argv(2))] = code;
- ! if (!map_show) return;
- }
- }
-
- ***************
- *** 910,917 ****
-
- CASE( "entry" ) {
- import char *dflt_enter_macro;
- !
- ! dflt_enter_macro = parse_enter_macro(f, NL);
- break;
- }
-
- --- 925,943 ----
-
- CASE( "entry" ) {
- import char *dflt_enter_macro;
- ! group_header *gh, *get_group_search();
- ! char *macro;
- ! int i;
- !
- ! macro = parse_enter_macro(f, NL);
- ! if (ARGTAIL) {
- ! for (i = 2; argv(i); i++) {
- ! start_group_search(argv(i));
- ! while (gh = get_group_search())
- ! gh->enter_macro = macro;
- ! }
- ! } else
- ! dflt_enter_macro = macro;
- break;
- }
-
-
- *** /usr/storm/nn6.3.9/kill.c Fri Oct 20 23:24:51 1989
- --- kill.c Tue Oct 24 10:11:54 1989
- ***************
- *** 6,11 ****
- --- 6,13 ----
- * kill file handling
- */
-
- + export int killed_articles;
- +
- char KILL_FILE[] = "kill";
- char COMPILED_KILL[] = "KILL.COMP";
-
- ***************
- *** 94,102 ****
- if (quick_match(string, kl->kill_pattern) == NULL)
- continue;
-
- ! if (kl->kill_flag & AUTO_KILL)
- return 1;
- !
- ah->flag |= A_SELECT | A_AUTO;
- break;
- }
- --- 96,106 ----
- if (quick_match(string, kl->kill_pattern) == NULL)
- continue;
-
- ! if (kl->kill_flag & AUTO_KILL) {
- ! killed_articles++;
- return 1;
- ! }
- !
- ah->flag |= A_SELECT | A_AUTO;
- break;
- }
- ***************
- *** 145,150 ****
- --- 149,155 ----
- } else
- if (quick_match(string, kl->kill_pattern) == NULL)
- continue;
- + killed_articles++;
- return 1;
- }
-
-
- *** /usr/storm/nn6.3.7/macro.c Fri Sep 8 12:46:46 1989
- --- macro.c Fri Nov 3 16:01:39 1989
- ***************
- *** 212,218 ****
- if (*lp == ':') {
- lp++;
- if (initial_set_commands) {
- ! if (!strncmp(lp, "set", 3) || !strncmp(lp, "unset", 5)) {
- m_new(M_SET_COMMAND);
- m->m_string = copy_str(lp);
- break;
- --- 212,220 ----
- if (*lp == ':') {
- lp++;
- if (initial_set_commands) {
- ! if (strncmp(lp, "local", 5) == 0 ||
- ! strncmp(lp, "set", 3) == 0 ||
- ! strncmp(lp, "unset", 5) == 0) {
- m_new(M_SET_COMMAND);
- m->m_string = copy_str(lp);
- break;
-
- *** /usr/storm/nn6.3.7/master.c Fri Sep 8 12:46:47 1989
- --- master.c Fri Nov 3 08:45:11 1989
- ***************
- *** 20,25 ****
- --- 20,27 ----
- *
- * -E expire by recolleting entire groups rather than copying files
- * -C check consistency of database on start-up
- + * -b include 'bad' articles (disables -B)
- + * -B remove 'bad' articles (just unlink the files)
- *
- * -I initialize
- * -t trace collection of each group
- ***************
- *** 26,31 ****
- --- 28,34 ----
- * -v print version and exit
- * -u update even if active is not modified
- * -w send wakeup to real master
- + * -Ltypes exclude 'types' entries from the log
- * -D debug
- */
-
- ***************
- *** 44,51 ****
- --- 47,59 ----
- debug_mode = 0;
-
- import int
- + ignore_bad_articles,
- + remove_bad_articles,
- retry_on_error;
-
- + import char
- + *log_entry_filter;
- +
- export int
- trace = 0,
- #ifdef NNTP
- ***************
- *** 69,75 ****
- --- 77,86 ----
-
- 'E', Bool_Option( clean_to_expire ),
- 'C', Bool_Option( check_on_startup ),
- + 'b', Bool_Option( ignore_bad_articles ),
- + 'B', Bool_Option( remove_bad_articles ),
-
- + 'L', String_Option( log_entry_filter ),
- 'D', Bool_Option( debug_mode ),
- 't', Bool_Option( trace ),
-
-
- *** /usr/storm/nn6.3.9/menu.c Fri Oct 20 23:24:53 1989
- --- menu.c Thu Nov 9 12:36:36 1989
- ***************
- *** 19,25 ****
- export int slow_mode = 0; /* mark selected articles with *s */
- export int re_layout = 0; /* Re: format presentation on menus */
- export int collapse_subject = 25; /* collapse long subjects at position */
- ! export int conf_group_entry = 0; /* ask whether group should be entered */
-
- export char *delayed_msg = NULL; /* give to msg() after redraw */
- export long dl_msg_arg = 0; /* optional arg to delayed_msg */
- --- 19,26 ----
- export int slow_mode = 0; /* mark selected articles with *s */
- export int re_layout = 0; /* Re: format presentation on menus */
- export int collapse_subject = 25; /* collapse long subjects at position */
- ! export int conf_group_entry = 0; /* ask whether group should be entered */
- ! export int auto_preview_mode = 0; /* preview rather than select */
-
- export char *delayed_msg = NULL; /* give to msg() after redraw */
- export long dl_msg_arg = 0; /* optional arg to delayed_msg */
- ***************
- *** 58,63 ****
- --- 59,65 ----
- #define REMOVE 5
- #define CANCEL 6
- #define ON_LEAVE 7
- + #define ON_READ 8
-
- static int how;
-
- ***************
- *** 122,127 ****
- --- 124,135 ----
- putchar((ah->flag & A_CANCEL) ? '#' : ' ');
- return;
-
- + case ON_READ:
- + if (cura < 0 || cura > numa) return;
- + gotoxy(1, lno);
- + putchar((ah->flag & A_READ) ? '.' : ' ');
- + return;
- +
- case ON_LEAVE:
- if (cura < 0 || cura > numa) return;
- gotoxy(1, lno);
- ***************
- *** 314,320 ****
- char *fmt;
-
- if (first <= start || n <= 0)
- ! if (last >= end)
- return "All";
- else
- fmt = "Top %d%%";
- --- 322,328 ----
- char *fmt;
-
- if (first <= start || n <= 0)
- ! if (last >= end || n <= 0)
- return "All";
- else
- fmt = "Top %d%%";
- ***************
- *** 352,357 ****
- --- 360,367 ----
- #define menu_return(cmd) \
- { menu_cmd = (cmd); goto menu_exit; }
-
- + flush_input();
- +
- o_firsta = firsta;
- o_mode = in_menu_mode;
- in_menu_mode = 1;
- ***************
- *** 876,881 ****
- --- 886,893 ----
- case K_ARTICLE_ID:
- if (numa < 0) goto nextmenu;
-
- + if (auto_preview_mode) goto auto_preview;
- +
- cura = article_id;
- how = TOGGLE;
- mark();
- ***************
- *** 1057,1070 ****
- article_id = cura;
- }
-
- temp = prompt_line;
-
- preview_next:
- ! ah = articles[firsta+article_id];
- ! cura = article_id + 1;
-
- no_raw();
- ! switch (more(ah, MM_PREVIEW, prompt_line)) {
-
- case MC_DO_KILL:
- if (!do_auto_kill()) break;
- --- 1069,1090 ----
- article_id = cura;
- }
-
- + auto_preview:
- temp = prompt_line;
-
- preview_next:
- ! cura = article_id;
- ! ah = articles[firsta+cura];
-
- no_raw();
- ! menu_cmd = more(ah, MM_PREVIEW, prompt_line);
- ! if (auto_preview_mode && ah->flag & A_READ && prompt_line >= 0) {
- ! how = ON_READ;
- ! mark();
- ! }
- ! next_cura = ++cura;
- !
- ! switch (menu_cmd) {
-
- case MC_DO_KILL:
- if (!do_auto_kill()) break;
- ***************
- *** 1084,1096 ****
- do_auto_select((regexp *)NULL, 2);
- /* FALL THRU */
-
- - case MC_REDRAW:
- - next_cura = cura;
- - goto redraw;
- -
- - case MC_NO_REDRAW:
- - break;
- -
- case MC_QUIT:
- menu_return( ME_QUIT );
-
- --- 1104,1109 ----
- ***************
- *** 1103,1108 ****
- --- 1116,1123 ----
- case MC_PREVIEW_NEXT:
- if (prompt_line < 0) { /* redrawn screen ! */
- if ((firsta + cura) >= n_articles) goto redraw;
- + if (auto_preview_mode &&
- + (articles[firsta+cura]->flag & A_SAME) == 0) goto redraw;
- prompt_line = Lines;
- } else {
- if (ah->flag & (A_LEAVE | A_LEAVE_NEXT)) {
- ***************
- *** 1112,1117 ****
- --- 1127,1134 ----
- cura++;
- }
- if (cura > numa) break;
- + if (auto_preview_mode &&
- + (articles[firsta+cura]->flag & A_SAME) == 0) break;
- prompt_line = temp;
- }
- article_id = cura;
- ***************
- *** 1123,1128 ****
- --- 1140,1146 ----
- goto preview_other;
-
- default:
- + if (prompt_line < 0) goto redraw;
- break;
- }
-
-
- *** /usr/storm/nn6.3.9/more.c Fri Oct 20 23:24:55 1989
- --- more.c Thu Nov 9 12:27:23 1989
- ***************
- *** 18,23 ****
- --- 18,24 ----
- import int preview_window;
- import int novice;
- import int slow_mode;
- + import int auto_preview_mode;
-
- import char *delayed_msg;
- import long dl_msg_arg;
- ***************
- *** 1093,1105 ****
- if ((mode & MM_PREVIEW) && more_cmd != MC_QUIT) {
- gotoxy(0, screen_offset);
- clrpage(screen_offset);
- ! if (more_cmd == MC_PREVIEW_NEXT ||
- ! more_cmd == MC_DO_SELECT || more_cmd == MC_DO_KILL) {
- ! if (screen_offset == 0) prompt_line = -1;
- ! } else {
- ! if (screen_offset == 0) return MC_REDRAW;
- ! if (more_cmd != MC_PREVIEW_OTHER) return MC_NO_REDRAW;
- }
- }
-
- return more_cmd;
- --- 1094,1105 ----
- if ((mode & MM_PREVIEW) && more_cmd != MC_QUIT) {
- gotoxy(0, screen_offset);
- clrpage(screen_offset);
- ! if (auto_preview_mode) {
- ! if ((ah->flag & (A_LEAVE | A_LEAVE_NEXT)) == 0)
- ! ah->flag |= A_READ;
- ! if (more_cmd == MC_NEXT) more_cmd = MC_PREVIEW_NEXT;
- }
- + if (screen_offset == 0) prompt_line = -1;
- }
-
- return more_cmd;
-
- *** /usr/storm/nn6.3.7/nn.c Fri Sep 8 12:46:50 1989
- --- nn.c Sun Oct 22 20:43:11 1989
- ***************
- *** 117,133 ****
- init_key_map();
- init_execute();
- init_macro();
-
- #ifdef NNTP
- nntp_check();
- #endif
- if (enter_admin_mode) {
- if (argc == 1) {
- init_term();
- visit_init_file(0);
- }
- - open_master(OPEN_READ);
- - visit_active_file();
- admin_mode(argv[1]);
- nn_exit(0);
- }
- --- 117,133 ----
- init_key_map();
- init_execute();
- init_macro();
- + open_master(OPEN_READ);
-
- #ifdef NNTP
- nntp_check();
- #endif
- if (enter_admin_mode) {
- + visit_active_file();
- if (argc == 1) {
- init_term();
- visit_init_file(0);
- }
- admin_mode(argv[1]);
- nn_exit(0);
- }
- ***************
- *** 151,158 ****
- print_version("Release %R.%V.%P #%U, Kim F. Storm, 1989\n\n");
- }
-
- - open_master(OPEN_READ);
- -
- if (also_read_articles) {
- if (article_limit < 0)
- article_limit = also_read_articles;
- --- 151,156 ----
-
- *** /usr/storm/nn6.3.9/nn.1 Fri Oct 20 23:24:58 1989
- --- nn.1 Fri Nov 17 19:16:23 1989
- ***************
- *** 903,909 ****
- || cd ~/src/nn ; patch
- .br
- .LP
- ! The following symbols are expanded in a file name:
- .TP
- .B $F
- will be expanded to the name of the current group with the periods
- --- 903,909 ----
- || cd ~/src/nn ; patch
- .br
- .LP
- ! The following symbols are expanded in a file name or command:
- .TP
- .B $F
- will be expanded to the name of the current group with the periods
- ***************
- *** 920,925 ****
- --- 920,927 ----
- .B $N
- will be expanded to the (local) article number, e.g. 1099. In
- selection mode it is only allowed at the end of the file name!
- + .B $(VAR)
- + is replaced by the string value of the environment variable \fIVAR\fP.
- .LP
- Using these symbols, a simple naming scheme for `default folder name' is
- .B +$G
- ***************
- *** 1429,1434 ****
- --- 1431,1439 ----
- .TP
- .B %
- Same as $A.
- + .TP
- + .B $(VAR)
- + is replaced by the string value of the environment variable \fIVAR\fP.
- .LP
- When the shell command is completed, you will be asked to hit any key
- to continue. If you hit the
- ***************
- *** 1523,1528 ****
- --- 1528,1540 ----
- Provide online help on the specified subject. If you omit the
- subject, a list of the available topics will be given.
- .TP
- + \fB:local\fP \fIvariable\fP [ \fIvalue\fP ]
- + Make the variable local to the current group. Subsequent changes to
- + the variable will only be effective until the current group is left.
- + If a value is specified, it will be assigned to the local variable.
- + To assign a new value to a boolean variable, the values \fBon\fP and
- + \fBoff\fP must be used.
- + .TP
- \fB:man\fP
- Call up the online manual. The manual is presented as a normal folder
- with the program name in the `From' field and the section title in the
- ***************
- *** 1712,1717 ****
- --- 1724,1740 ----
- .B :set
- command without arguments.
- .LP
- + Variables are global by default, but a local instantiation of the
- + variable can be created using the \fB:local\fP command. The local
- + variable will overlay the global variable as long as the current group
- + is active, i.e. the global variable will be used again when you exit
- + the current group. The initial value of the local variable will be
- + the same as the global variable, unless a new value is specified in
- + the \fB:local\fP command:
- + .sp 0.5v
- + \fB:local\fP \fIvariable\fP [ \fIvalue\fP ]
- + .sp 0.5v
- + .LP
- The following variables are available:
- .TP
- \fBalso-subgroups\fP (boolean, default true)
- ***************
- *** 1725,1730 ****
- --- 1748,1763 ----
- asterisk `*', e.g. comp.unix*, will include the group as well as all
- subgroups independently of the setting of \fBalso-subgroups\fP.
- .TP
- + \fBauto-preview-mode\fP (boolean, default false)
- + Enables \fIAuto Preview Mode\fP. In this mode, selecting an article
- + on the menu using its article id (letter a-z) will enter preview mode
- + on that article immediately. Furthermore, the `n' {\fBnext-article\fP}
- + command will preview the next article on the menu only if it has the
- + same subject as the current article; otherwise, it will return to the
- + menu with the cursor placed on the next article. The \fBcontinue\fP
- + command at the end of the article and the `=' {\fBgoto-menu\fP}
- + returns to the menu immediately as usual.
- + .TP
- \fBbackup\fP (boolean, default true)
- Backup the rc file on start-up. Setting
- .B backup
- ***************
- *** 1888,1894 ****
- when \fInn\fP is prompting for a string, e.g. a file name.
- .TP
- \fBlayout\fP \fInumber\fP (integer, default 1)
- ! Set the menu layout. The argument must be a number between 0 and 3.
- .TP
- \fBlimit\fP \fImax-articles\fP (integer, default infinite)
- .I Limit
- --- 1921,1927 ----
- when \fInn\fP is prompting for a string, e.g. a file name.
- .TP
- \fBlayout\fP \fInumber\fP (integer, default 1)
- ! Set the menu layout. The argument must be a number between 0 and 5.
- .TP
- \fBlimit\fP \fImax-articles\fP (integer, default infinite)
- .I Limit
- ***************
- *** 2956,2965 ****
- The commands are executed if the TERM environment variable contains
- the value specified by \fIterm-type\fP.
- .TP
- ! \fBon entry\fP
- .br
- These commands (macro format!) are executed every time \fInn\fP enters a
- ! news group. The `:set' and `:unset' commands at the beginning of the
- command group are executed \fIbefore\fP \fInn\fP collects the articles
- in the group, so it is possible to set variables like
- \fBcross-post\fP. The other commands, and :set/:unset commands that
- --- 2989,3004 ----
- The commands are executed if the TERM environment variable contains
- the value specified by \fIterm-type\fP.
- .TP
- ! \fBon entry\fP [ \fIgroup list\fP ]
- .br
- These commands (macro format!) are executed every time \fInn\fP enters a
- ! news group. If a group list is not specified, the commands are
- ! associated with all groups which don't have its own entry macro
- ! specified in the group sequence. Otherwise, the entry macro will be
- ! associated with the groups in the list. The group list is specified
- ! using the meta-notations described in the presentation sequence section.
- ! .sp 0.5v
- ! The `:set', `:unset', and `:local' commands at the beginning of the
- command group are executed \fIbefore\fP \fInn\fP collects the articles
- in the group, so it is possible to set variables like
- \fBcross-post\fP. The other commands, and :set/:unset commands that
- ***************
- *** 2967,2979 ****
- \fIafter\fP the first menu page is presented.
- .sp 0.5v
- .nf
- ! \fBon entry\fP
- ! :unset cross-post
- \fBend\fP
- .fi
- - .sp 0.5v
- - The `entry' command group is \fInot\fP executed if the group has its
- - own entry action specified in the presentation sequence (see below).
- .SH GROUP PRESENTATION SEQUENCE
- News groups are normally presented in the sequence defined in the
- system-wide
- --- 3006,3015 ----
- \fIafter\fP the first menu page is presented.
- .sp 0.5v
- .nf
- ! \fBon entry\fP comp.sources* alt.sources
- ! :local cross-post on
- \fBend\fP
- .fi
- .SH GROUP PRESENTATION SEQUENCE
- News groups are normally presented in the sequence defined in the
- system-wide
- ***************
- *** 3097,3103 ****
- .TP
- \&< group.name
- Place the group (and its subgroups) at the beginning of the
- ! presentation sequence.
- .TP
- \&> group.name
- Place the group (and its subgroups) after all other groups that are
- --- 3133,3141 ----
- .TP
- \&< group.name
- Place the group (and its subgroups) at the beginning of the
- ! presentation sequence. Notice that each `<' entry will place the
- ! group(s) at the beginning of the current sequence, i.e. < A < B < C
- ! will generate the sequence C B A.
- .TP
- \&> group.name
- Place the group (and its subgroups) after all other groups that are
-
- *** /usr/storm/nn6.3.7/nnadmin.1m Fri Sep 8 12:46:50 1989
- --- nnadmin.1m Thu Nov 16 14:40:25 1989
- ***************
- *** 523,528 ****
- --- 523,529 ----
- .br
- .DT
- .ta \w'$db/DATA/\fInnn\fP.dx'u+3m
- + .\"ta 0 16
- $db/MASTER Database master index
- .br
- $db/GROUPS News group names in MASTER file order
-
- *** /usr/storm/nn6.3.7/nncheck.1 Fri Sep 8 12:46:50 1989
- --- nncheck.1 Thu Nov 16 14:40:25 1989
- ***************
- *** 57,62 ****
- --- 57,63 ----
- .sp 0.5v
- .DT
- .ta 1i 2i
- + .\"ta 4 12
- .nf
- \fB%-code\fP \fBresulting output\fP
- .sp 0.5v
- ***************
- *** 85,90 ****
- --- 86,92 ----
- .SH FILES
- .DT
- .ta \w'$db/MASTER'u+6m
- + .\"ta 0 12
- ~/.nn/rc The record of read articles
- .br
- $db/MASTER The database master index
-
- *** /usr/storm/nn6.3.7/nngoback.1 Fri Sep 8 12:46:50 1989
- --- nngoback.1 Thu Nov 16 14:40:24 1989
- ***************
- *** 64,69 ****
- --- 64,70 ----
- .SH FILES
- .DT
- .ta \w'$lib/date_regexp'u+3m
- + .\"ta 0 20
- ~/.nn/rc The record of read articles.
- .br
- ~/.nn/rc.bak1 The original rc file before goback.
-
- *** /usr/storm/nn6.3.7/nngrep.1 Fri Sep 8 12:46:50 1989
- --- nngrep.1 Thu Nov 16 14:40:24 1989
- ***************
- *** 29,34 ****
- --- 29,35 ----
- .SH FILES
- .DT
- .ta \w'~/.nn/rc.bak'u+3m
- + .\"ta 0 12
- ~/.nn/rc The record of read articles
- .DT
- .SH SEE ALSO
-
- *** /usr/storm/nn6.3.7/nnmaster.1m Fri Sep 8 12:46:51 1989
- --- nnmaster.1m Thu Nov 16 14:40:23 1989
- ***************
- *** 17,27 ****
- [ \-\fBr [ \fP\fIN\fP ] ]
- [ \-\fBe\fP\fIN\fP ]
- [ \-\fBy\fP\fIN\fP ]
- ! [ \-\fBf\fP ]
- ! [ \-\fBC\fP ]
- ! [ \-\fBE\fP ]
- ! [ \-\fBu\fP ]
- ! [ \-\fBt\fP ]
- .SH DESCRIPTION
- .I nnmaster
- is the daemon which is responsible for building and maintaining the
- --- 17,24 ----
- [ \-\fBr [ \fP\fIN\fP ] ]
- [ \-\fBe\fP\fIN\fP ]
- [ \-\fBy\fP\fIN\fP ]
- ! [ \-\fBL\fP\fItypes\fP ]
- ! [ \-\fBBbCEfut\fP ]
- .SH DESCRIPTION
- .I nnmaster
- is the daemon which is responsible for building and maintaining the
- ***************
- *** 87,92 ****
- --- 84,102 ----
- Run \fInnmaster\fP in foreground in daemon mode (see \-\fBr\fP).
- Useful if \fInnmaster\fP is invoked from inittab.
- .TP
- + .B \-b
- + Normally, articles without a proper news header (no Newsgroups: line)
- + are ignored. Specifying the \-\fBb\fP option causes these `bad'
- + articles to be included in the database (normally with no sender or
- + subject).
- + .TP
- + .B \-B
- + Remove `bad' articles. Sometimes, articles without a header ends up
- + in the news spool directory. These articles have no article id, and
- + therefore, they will never be expired by \fBexpire\fP(8). This option
- + will allow the \fInnmaster\fP to silently remove these articles (a `B'
- + entry will occur in the log file).
- + .TP
- \-\fBe\fP \fIart\fP
- .br
- Run internal
- ***************
- *** 138,143 ****
- --- 148,157 ----
- keep news for a long time, you should not use the \-E option
- without a little thought.
- .TP
- + \-\fBL\fP \fItypes\fP
- + Exclude the specified entry types from the log file. This is normally
- + used to exclude the 'C'ollecting and e'X'pire entries (\-\fBL\fPCX).
- + .TP
- .B \-I
- Initialize database. This option will erase an existing database, and
- create an empty database containing entries for the currently known
- ***************
- *** 173,178 ****
- --- 187,193 ----
- .LP
- .DT
- .ta \w'$db/DATA/\fInnn\fP.[dx]'u+3m
- + .\"ta 0 20
- $db/MASTER Database master index
- .br
- $db/GROUPS News group names in MASTER file order
-
- *** /usr/storm/nn6.3.7/nntidy.1 Fri Sep 8 12:46:51 1989
- --- nntidy.1 Thu Nov 16 14:40:22 1989
- ***************
- *** 17,22 ****
- --- 17,23 ----
- .SH FILES
- .DT
- .ta \w'~/.nn/rc.bak'u+3m
- + .\"ta 0 20
- ~/.nn/rc The record of read articles
- .br
- ~/.nn/rc.bak The original rc file before tidy
-
- *** /usr/storm/nn6.3.7/nnusage.1m Fri Sep 8 12:46:51 1989
- --- nnusage.1m Thu Nov 16 14:40:22 1989
- ***************
- *** 23,28 ****
- --- 23,29 ----
- .SH FILES
- .DT
- .ta \w'$lib/Log'u+3m
- + .\"ta 0 20
- $lib/Log The log file
- .DT
- .SH SEE ALSO
-
- *** /usr/storm/nn6.3.7/rc.c Fri Sep 8 12:46:54 1989
- --- rc.c Sun Oct 22 17:43:54 1989
- ***************
- *** 377,383 ****
- n = unread_articles;
- add_unread(gh, 1);
- if (trace)
- ! printf("%s: %d\n", gh->group_name, unread_articles - n);
- }
- }
- }
- --- 377,383 ----
- n = unread_articles;
- add_unread(gh, 1);
- if (trace)
- ! printf("%6d %s\n", unread_articles - n, gh->group_name);
- }
- }
- }
-
- *** /usr/storm/nn6.3.9/save.c Fri Oct 20 23:25:04 1989
- --- save.c Wed Oct 25 10:23:21 1989
- ***************
- *** 18,23 ****
- --- 18,24 ----
- export int save_report = 1;
- export int quick_save = 0;
- export int conf_append = 0;
- + export int conf_create = 1;
-
- export char *save_counter_format = "%d"; /* format of save counter */
-
- ***************
- *** 241,247 ****
- last = strrchr(start, '/');
- /* last != NULL => non-existing directories */
-
- ! if (!(save_mode & SEPARATE_FILES) || last) {
- printf("\rCreate ");
- for (np = save_name; *np; np++) {
- if (np == start) putchar('\"');
- --- 242,248 ----
- last = strrchr(start, '/');
- /* last != NULL => non-existing directories */
-
- ! if (conf_create && (!(save_mode & SEPARATE_FILES) || last)) {
- printf("\rCreate ");
- for (np = save_name; *np; np++) {
- if (np == start) putchar('\"');
-
- *** /usr/storm/nn6.3.7/sequence.c Fri Sep 8 12:46:59 1989
- --- sequence.c Wed Oct 25 12:43:06 1989
- ***************
- *** 80,85 ****
- --- 80,86 ----
- found = 0;
- start_group_search(group);
- while (gh = get_group_search()) {
- + gh->group_flag |= G_DONE;
- if ((gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
- continue;
- found++;
- ***************
- *** 311,319 ****
- start_group_search(group);
-
- while (gh = get_group_search()) {
-
- gh->save_file = dflt_save;
- ! gh->enter_macro = enter_macro;
-
- if (group_name_args == 0 &&
- (gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
- --- 312,322 ----
- start_group_search(group);
-
- while (gh = get_group_search()) {
- + gh->group_flag |= G_DONE;
-
- gh->save_file = dflt_save;
- ! if (gh->enter_macro == NULL) /* not set by "on entry" */
- ! gh->enter_macro = enter_macro;
-
- if (group_name_args == 0 &&
- (gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
- ***************
- *** 397,402 ****
- --- 400,406 ----
- static int gs_length, gs_index, gs_mode;
- static group_header *gs_only_group = NULL;
-
- + #define GS_PREFIX0 0 /* group (or group*) */
- #define GS_PREFIX 1 /* group. */
- #define GS_SUFFIX 2 /* .group */
- #define GS_INFIX 3 /* .group. */
- ***************
- *** 403,409 ****
- #define GS_NEW_GROUP 4 /* new group */
- #define GS_ALL 5 /* all / . */
-
- ! static start_group_search(group)
- char *group;
- {
- char *dot;
- --- 407,413 ----
- #define GS_NEW_GROUP 4 /* new group */
- #define GS_ALL 5 /* all / . */
-
- ! start_group_search(group)
- char *group;
- {
- char *dot;
- ***************
- *** 425,431 ****
- gs_mode = GS_ALL;
- gs_length = 0;
- } else {
- ! gs_mode = GS_PREFIX;
-
- if (strncmp(group, "all.", 4) == 0) group += 3;
-
- --- 429,435 ----
- gs_mode = GS_ALL;
- gs_length = 0;
- } else {
- ! gs_mode = GS_PREFIX0;
-
- if (strncmp(group, "all.", 4) == 0) group += 3;
-
- ***************
- *** 433,440 ****
-
- if ((dot = strrchr(group, '.')) != NULL && dot != group) {
- if (dot[1] == NUL || strcmp(dot+1, "all") == 0) {
- ! *dot = NUL;
- ! if (gs_mode == GS_SUFFIX) gs_mode = GS_INFIX;
- }
- }
-
- --- 437,444 ----
-
- if ((dot = strrchr(group, '.')) != NULL && dot != group) {
- if (dot[1] == NUL || strcmp(dot+1, "all") == 0) {
- ! dot[1] = NUL;
- ! gs_mode = (gs_mode == GS_SUFFIX) ? GS_INFIX : GS_PREFIX;
- }
- }
-
- ***************
- *** 447,453 ****
- }
-
-
- ! static group_header *get_group_search()
- {
- register group_header *gh;
- register int c, tail;
- --- 451,457 ----
- }
-
-
- ! group_header *get_group_search()
- {
- register group_header *gh;
- register int c, tail;
- ***************
- *** 456,462 ****
- gh = gs_only_group;
- gs_only_group = NULL;
- if (gh->group_flag & (G_DONE | G_NO_DIRECTORY)) return NULL;
- - gh->group_flag |= G_DONE;
- return gh;
- }
-
- --- 460,465 ----
- ***************
- *** 474,481 ****
- if ((gh->group_flag & G_NEW) == 0) continue;
- break;
-
- ! case GS_PREFIX:
- if ((c = (gh->group_name)[gs_length]) != NUL && c != '.') continue;
- if (strncmp(gh->group_name, gs_group, gs_length)) continue;
- break;
-
- --- 477,485 ----
- if ((gh->group_flag & G_NEW) == 0) continue;
- break;
-
- ! case GS_PREFIX0:
- if ((c = (gh->group_name)[gs_length]) != NUL && c != '.') continue;
- + case GS_PREFIX:
- if (strncmp(gh->group_name, gs_group, gs_length)) continue;
- break;
-
- ***************
- *** 492,499 ****
- }
-
- gs_more_groups--;
- - gh->group_flag |= G_DONE;
- -
- return gh;
- }
-
- --- 496,501 ----
-
- *** /usr/storm/nn6.3.9/term.c Fri Oct 20 23:25:06 1989
- --- term.c Wed Oct 25 10:24:17 1989
- ***************
- *** 688,700 ****
- --- 688,708 ----
- }
- #endif /* CBREAK */
-
- + static int do_flush_input = 0;
- +
- flush_input()
- {
- #ifdef HAVE_TERMIO
- ioctl(0, TCFLSH, 0);
- + do_flush_input = 1;
- + #else
- + #ifdef FREAD
- + int arg = FREAD;
- + ioctl(0, TIOCFLUSH, &arg);
- #else
- ioctl(0, TIOCFLUSH, 0);
- #endif
- + #endif
- }
-
- int enable_stop = 1;
- ***************
- *** 721,726 ****
- --- 729,739 ----
- #ifdef KEY_BURST
- static char cbuf[KEY_BURST], *cp;
- static int n = 0;
- +
- + if (do_flush_input) {
- + do_flush_input = 0;
- + n = 0;
- + }
- #else
- int n;
- unsigned char first_key;
-
- *** /usr/storm/nn6.3.9/variable.c Fri Oct 20 23:25:08 1989
- --- variable.c Fri Nov 17 18:51:47 1989
- ***************
- *** 30,38 ****
- --- 30,40 ----
- import int /* boolean variables */
- also_cross_postings,
- also_subgroups,
- + auto_preview_mode,
- compress_mode,
- conf_append,
- conf_auto_quit,
- + conf_create,
- conf_dont_sleep,
- conf_group_entry,
- delay_redraw,
- ***************
- *** 104,109 ****
- --- 106,112 ----
- char **var_addr;
- } variables[] = {
- "also-subgroups", V_BOOLEAN | V_INIT, 0, (char **)&also_subgroups,
- + "auto-preview-mode",V_BOOLEAN, 0, (char **)&auto_preview_mode,
- "backup", V_BOOLEAN | V_INIT, 0, (char **)&keep_rc_backup,
- "collapse-subject", V_INTEGER, 3, (char **)&collapse_subject,
- "columns", V_INTEGER, 1, (char **)&Columns,
- ***************
- *** 112,117 ****
- --- 115,121 ----
- "compress", V_BOOLEAN, 0, (char **)&compress_mode,
- "confirm-append", V_BOOLEAN, 0, (char **)&conf_append,
- "confirm-auto-quit",V_BOOLEAN, 0, (char **)&conf_auto_quit,
- + "confirm-create", V_BOOLEAN, 0, (char **)&conf_create,
- "confirm-entry", V_BOOLEAN, 0, (char **)&conf_group_entry,
- "confirm-messages", V_BOOLEAN, 0, (char **)&conf_dont_sleep,
- "cross-filter-seq", V_BOOLEAN, 0, (char **)&seq_cross_filtering,
- ***************
- *** 138,144 ****
- "lines", V_INTEGER, 1, (char **)&Lines,
- "long-menu", V_BOOLEAN, 1, (char **)&long_menu,
- "macro-debug", V_BOOLEAN, 0, (char **)¯o_debug,
- ! "mail", V_STRING, 0, (char **)&mail_box,
- "mail-format", V_BOOLEAN, 0, (char **)&use_mail_folders,
- "mail-header", V_STRING, 0, (char **)&extra_mail_headers,
- "mail-record", V_STRING, 2, (char **)&mail_record,
- --- 142,148 ----
- "lines", V_INTEGER, 1, (char **)&Lines,
- "long-menu", V_BOOLEAN, 1, (char **)&long_menu,
- "macro-debug", V_BOOLEAN, 0, (char **)¯o_debug,
- ! "mail", V_STRING, 2, (char **)&mail_box,
- "mail-format", V_BOOLEAN, 0, (char **)&use_mail_folders,
- "mail-header", V_STRING, 0, (char **)&extra_mail_headers,
- "mail-record", V_STRING, 2, (char **)&mail_record,
- ***************
- *** 226,231 ****
- --- 230,236 ----
- if (strncmp(variable, "no", 2) == 0) {
- on = !on;
- variable += 2;
- + if (variable[0] == '-') variable++;
- }
-
- if ((var = lookup_variable(variable)) == NULL)
- ***************
- *** 262,269 ****
-
- case 2:
- if (on) {
- adjust(val_string);
- ! if (val_string) STR_VAR = home_relative(val_string);
- } else
- STR_VAR = (char *)NULL;
- break;
- --- 267,279 ----
-
- case 2:
- if (on) {
- + char exp_buf[FILENAME];
- +
- adjust(val_string);
- ! if (val_string) {
- ! if (expand_file_name(exp_buf, val_string))
- ! STR_VAR = home_relative(exp_buf);
- ! }
- } else
- STR_VAR = (char *)NULL;
- break;
- ***************
- *** 280,285 ****
- --- 290,297 ----
-
- case V_BOOLEAN:
-
- + if (val_string) on = strncmp(val_string, "off", 3);
- +
- switch (var->var_op) {
- case 0:
- BOOL_VAR = on;
- ***************
- *** 367,373 ****
-
- disp_variables()
- {
- ! char *str, *key_name();
- int i, b;
- register struct variable_defs *var;
-
- --- 379,385 ----
-
- disp_variables()
- {
- ! char *str, *key_name(), *pushed;
- int i, b;
- register struct variable_defs *var;
-
- ***************
- *** 380,392 ****
- so_printf("\1Variable settings:\1");
-
- for (var = variables; var < &variables[TABLE_SIZE]; var++) {
- switch (VAR_TYPE) {
- case V_STRING:
- str = (var->var_op == 1) ? CBUF_VAR : STR_VAR;
- ! if (str == NULL || *str == NUL) break;
-
- if (pg_next() < 0) goto out;
- ! printf("%-20.20s = \"%s\"\n", var->var_name, str);
- break;
-
- case V_BOOLEAN:
- --- 392,405 ----
- so_printf("\1Variable settings:\1");
-
- for (var = variables; var < &variables[TABLE_SIZE]; var++) {
- + pushed = var_on_stack(var) ? ">" : " ";
- switch (VAR_TYPE) {
- case V_STRING:
- str = (var->var_op == 1) ? CBUF_VAR : STR_VAR;
- ! if (str == NULL) str = "";
-
- if (pg_next() < 0) goto out;
- ! printf("%s %-20.20s = \"%s\"\n", pushed, var->var_name, str);
- break;
-
- case V_BOOLEAN:
- ***************
- *** 393,410 ****
- if (pg_next() < 0) goto out;
- b = BOOL_VAR;
- if (var->var_op == 2 || var->var_op == 4) b = !b;
- ! printf("%s%s\n", b ? "" : "no ", var->var_name);
- break;
-
- case V_INTEGER:
- i = INT_VAR;
- if (pg_next() < 0) goto out;
- ! printf("%-20.20s = %d\n", var->var_name, i);
- break;
-
- case V_KEY:
- if (pg_next() < 0) goto out;
- ! printf("%-20.20s = %s\n", var->var_name, key_name(KEY_VAR));
- break;
-
- case V_SPECIAL:
- --- 406,423 ----
- if (pg_next() < 0) goto out;
- b = BOOL_VAR;
- if (var->var_op == 2 || var->var_op == 4) b = !b;
- ! printf("%s %-20.20s %s\n", pushed, var->var_name, b ? "" : "= off");
- break;
-
- case V_INTEGER:
- i = INT_VAR;
- if (pg_next() < 0) goto out;
- ! printf("%s %-20.20s = %d\n", pushed, var->var_name, i);
- break;
-
- case V_KEY:
- if (pg_next() < 0) goto out;
- ! printf("%s %-20.20s = %s\n", pushed, var->var_name, key_name(KEY_VAR));
- break;
-
- case V_SPECIAL:
- ***************
- *** 414,420 ****
- case 2:
- if (also_read_articles) {
- if (pg_next() < 0) goto out;
- ! printf("%-20.20s = %d\n", var->var_name, article_limit);
- }
- break;
- }
- --- 427,433 ----
- case 2:
- if (also_read_articles) {
- if (pg_next() < 0) goto out;
- ! printf("%s %-20.20s = %d\n", pushed, var->var_name, article_limit);
- }
- break;
- }
- ***************
- *** 501,506 ****
- --- 514,524 ----
- head = path;
- tail = path + index;
- while (*head && isspace(*head)) head++;
- + if (strncmp(head, "no", 2) == 0) {
- + head += 2;
- + if (*head == '-') head++;
- + }
- +
- help_var = var = variables;
- len = tail - head;
-
- ***************
- *** 542,544 ****
- --- 560,714 ----
- return 0;
- }
-
- + static struct var_stack {
- + struct var_stack *next;
- + struct variable_defs *v;
- + union {
- + int ivar;
- + int bool;
- + char key;
- + char *str;
- + } value;
- + } *var_stack = NULL, *vs_pool = NULL;
- +
- + mark_var_stack()
- + {
- + register struct var_stack *vs;
- +
- + if (vs_pool) {
- + vs = vs_pool;
- + vs_pool = vs->next;
- + } else {
- + vs = (struct var_stack *)calloc(1, sizeof(struct var_stack));
- + mem_check((char *)vs, 1, "var structure");
- + }
- + vs->next = var_stack;
- + var_stack = vs;
- + vs->v = NULL;
- + }
- +
- + push_variable(variable)
- + char *variable;
- + {
- + register struct variable_defs *var;
- + register struct var_stack *vs;
- +
- + if (strncmp(variable, "no", 2) == 0) {
- + variable += 2;
- + if (variable[0] == '-') variable++;
- + }
- +
- + if ((var = lookup_variable(variable)) == NULL) {
- + msg("pushing unknown variable %s", variable);
- + return 0;
- + }
- +
- + mark_var_stack();
- + vs = var_stack;
- + vs->v = var;
- +
- + switch (VAR_TYPE) {
- +
- + case V_STRING:
- +
- + switch (var->var_op) {
- + case 0: /* if we update one of these variables, */
- + case 2: /* new storage will be allocated for it */
- + case 3: /* so it is ok just to save the pointer */
- + vs->value.str = STR_VAR;
- + break;
- +
- + case 1: /* we free this memory when restored */
- + vs->value.str = copy_str(CBUF_VAR);
- + break;
- + }
- + break;
- +
- + case V_BOOLEAN:
- + vs->value.bool = BOOL_VAR;
- + break;
- +
- + case V_INTEGER:
- + vs->value.ivar = INT_VAR;
- + break;
- +
- + case V_KEY:
- + vs->value.key = KEY_VAR;
- + break;
- +
- + case V_SPECIAL:
- + msg("Cannot push pseudo variable %s", var->var_name);
- + break;
- + }
- +
- + return 1;
- + }
- +
- + restore_variables()
- + {
- + register struct variable_defs *var;
- + register struct var_stack *vs, *vs1;
- +
- + vs = var_stack;
- +
- + while (vs != NULL) {
- + if ((var = vs->v) == NULL) {
- + var_stack = vs->next;
- + vs->next = vs_pool;
- + vs_pool = vs;
- + return;
- + }
- +
- + switch (VAR_TYPE) {
- +
- + case V_STRING:
- + switch (var->var_op) {
- + case 0: /* only restore the string if changed; then we */
- + case 2: /* can also free the memory occupied by the */
- + case 3: /* 'new' value (if not NULL) */
- + if (STR_VAR != vs->value.str) {
- + if (STR_VAR != NULL) free(STR_VAR);
- + STR_VAR = vs->value.str;
- + }
- + break;
- +
- + case 1: /* it fitted before, so it will fit againg */
- + strcpy(CBUF_VAR, vs->value.str);
- + free(vs->value.str);
- + break;
- + }
- + break;
- +
- + case V_BOOLEAN:
- + BOOL_VAR = vs->value.bool;
- + break;
- +
- + case V_INTEGER:
- + INT_VAR = vs->value.ivar;
- + break;
- +
- + case V_KEY:
- + KEY_VAR = vs->value.key;
- + break;
- +
- + case V_SPECIAL: /* these are not saved, so... */
- + break;
- + }
- +
- + vs1 = vs->next;
- + vs->next = vs_pool;
- + vs_pool = vs;
- + vs = vs1;
- + }
- + var_stack = NULL;
- + }
- +
- + static var_on_stack(var)
- + register struct variable_defs *var;
- + {
- + register struct var_stack *vs;
- +
- + for (vs = var_stack; vs; vs = vs->next)
- + if (vs->v == var) return 1;
- + return 0;
- + }
-
-